package com.gu.reentrantLock;

/**
 * @Author: gusongliao
 * @Description: 演示可重入锁
 * @createDate 2023/05/27 18:32
 */
public class SyncLockDemo6_3 {

    public synchronized void add() {
        add();
    }

    public static void main(String[] args) {

        // Exception in thread "main" java.lang.StackOverflowError
        /** 输出效果如下
         * Exception in thread "main" java.lang.StackOverflowError
         * 输出说明，上述错误为 栈溢出异常。
         * 以上错误为频繁调用add方法导致，说明  synchronized 为可重入锁
         * 举例说明：
         *
         * 如果不可重入：调用第一次时正常进入
         *      1、add {
         *          加锁
         *          add {
         *              发现有锁（不是同一把锁）不能执行，会卡在这个位置。
         *
         *
         * 如果可以重入
         *      1、add {
         *          加锁
         *            add {
         *              重入锁（一把锁）
         *                  add {
         *                      重入锁（一把锁）
         *                          add {
         *                              ...
         *                          }
         *                  }
         *            }
         *          }
         * 导致栈溢出
         */
        new SyncLockDemo6_3().add();

        // synchronized
        /**  输出效果如下
         * t1 外层
         * t1 中层
         * t1 内层
         */
        Object o = new Object();
        new Thread(() -> {
            synchronized (o) {
                System.out.println(Thread.currentThread().getName() + " 外层");

                synchronized (o) {
                    System.out.println(Thread.currentThread().getName() + " 中层");

                    synchronized (o) {
                        System.out.println(Thread.currentThread().getName() + " 内层");
                    }
                }

            }
        }, "t1").start();

    }

}
